package Inference;

import java.io.*;

/**
 * Métodos para manipular fatos na construção do terminal de consultas
 * @author Plínio
 */
public class Fatos {
    public String fatos;
    

    
 /**
     * Operação para dividir os fatos concentrados em uma única String em um vetor de Strings onde cada posição guarda um fato isolado.
     * @param fatosTraduzidos
     * fatosTraduzidos são os fatos extraidos do XML
     * @return
     * Retorna um vetor de String, onde cada índice corresponde a um fato.
     */
    public String[] getFatosSeparados(String fatosTraduzidos) {
        //remove quebras de linha
        fatosTraduzidos = fatosTraduzidos.replaceAll("(\n|\r)", "");
        //separa os fatos através do ponto final dos axiomas.
        String[] fatosSeparados = fatosTraduzidos.split("\\.");
        
        return fatosSeparados;
    }

    /**
     *
     * @param fatosSeparados
     * String de fatos
     * @return
     * Cada índice no vetor de retorno contém apenas o nome de um fato anteriormente representado no mesmo índice.
     */
    public String[] getNomesFatos(String[] fatosSeparados) {
       
        String[] nomeFatos = new String[fatosSeparados.length];
        
        for (int i = 0; i < fatosSeparados.length; i++) {
            int indiceParenteses = fatosSeparados[i].indexOf("(");
            //System.out.println(fatosSeparados[i]);
            if(!(fatosSeparados[i].equals(" "))){
                if(!(fatosSeparados[i]==null)){
                    nomeFatos[i] = fatosSeparados[i].substring(0, indiceParenteses);
                }
            }
        }

        return nomeFatos;
    }

    /**
     * Retorna o nome de um único fato regra.
     * @param um fato
     * @return
     */
    public String getNomeRegra(String fato) {
        String nomeFato = "";

        int indiceParenteses = fato.indexOf("(");
        nomeFato = fato.substring(0, indiceParenteses);

        return nomeFato;
    }

    /**
     * Retorna os argumentos de um fato
     * @param fato
     * O fato completo, com o nome e os argumentos.
     * @return
     * Um argumento do fato é representado em cada índice do vetor.
     */
    public String[] getArgumentosFatos(String fato) {
        int idxAbreParenteses = fato.indexOf("(");
        int idxFechaParenteses = fato.indexOf(")");

        String[] argumentos = fato.substring(idxAbreParenteses + 1, idxFechaParenteses).split(",");

        return argumentos;
    }   

    
     /**
     * Retorna o fato cujo primeiro argumento é "base" ou "modificado"
     * É utilizado para compor a Regra Base que identifica um mesmo elemento das versões do XML
     * @param fatosSeparados
     * Lista dos fatos traduzidos e separados em cada posição da String
     * @param versao
     * "base" ou "modificado"
     * @return
     * Retorna o fato cujo primeiro argumento é "base" ou "modificado" em String
     */
    public String getFatoPrincipal(String[] fatosSeparados,String versao) {
        String fatoPrincipal="";
        String segundoArgumento="";
        if (versao.equals("base")){
            segundoArgumento="Fb";
        }else if(versao.equals("modificado")){
            segundoArgumento="Fm";
        }
        for (int i=0;i<fatosSeparados.length;i++){
            String[] argumentos = getArgumentosFatos(fatosSeparados[i]);
            //varrendo os argumentos coletados para saber se algum contem o fato principal
            for (int j=0;j<argumentos.length;j++){
                //tenho que testar se tem mais de 1 argumento, para fujirmos do fato do nó raiz
                //vai ser sempre o primeiro argumento, nao preciso testar os outros
                if((argumentos.length>1)&&(argumentos[0].equals(versao))){
                    //até aqui vem como funcionario(versao,idX).
                    //preciso montar o fato com o segundo argumento sendo uma Variável prolog
                    String nomeFatoPrincipal=getNomeRegra(fatosSeparados[i]);
                    String argumentosFatoPrincipal = "("+argumentos[0]+","+segundoArgumento+")";
                    fatoPrincipal=nomeFatoPrincipal+argumentosFatoPrincipal;
                    break;
                }
            }
        }  

        return fatoPrincipal;
    }
    
    
    /**
     * Description of the Method
     *
     * @param file
     *          The file to be turned into a String
     * @return  The file as String encoded in the platform
     * default encoding
     */
    public String fileToString(String file) throws FileNotFoundException, IOException {
        String result;
        result = "";
        BufferedReader br = new BufferedReader(new FileReader(file));  
  
        while(br.ready()){  
                String linha = br.readLine();  
                
                 result = result + "\n" +linha;
        }  
        
        br.close();
        return result;
    }
}
